library(hexbin)
library(ggplot2)
library(roahd)
library("fdatest")
Loading required package: fda
Loading required package: splines
Loading required package: fds
Loading required package: rainbow
Loading required package: MASS

Attaching package: ‘MASS’

The following object is masked from ‘package:dplyr’:

    select

Loading required package: pcaPP
Loading required package: RCurl

Attaching package: ‘RCurl’

The following object is masked from ‘package:tidyr’:

    complete

Loading required package: deSolve

Attaching package: ‘fda’

The following object is masked from ‘package:roahd’:

    fbplot

The following object is masked from ‘package:lattice’:

    melanoma

The following object is masked from ‘package:graphics’:

    matplot
library(spatstat.geom)
Loading required package: spatstat.data
spatstat.geom 3.2-8

Attaching package: ‘spatstat.geom’

The following object is masked from ‘package:MASS’:

    area

The following object is masked from ‘package:grid’:

    as.mask

load and preprocess the data

data_numeric_cleaned = readRDS("data_final/data_numeric_cleaned.RData")
survey_data = readRDS("data_final/survey_reduced.RData")

combine the data

combined_data <- merge(data_numeric_cleaned, survey_data, by.x = "id", by.y = "id")

single ecdf

person_id <- "03Nplw4GO2h5ut5"  # Sostituisci con l'ID della persona desiderata
covariate <- "danceability"  # Sostituisci con la covariata desiderata

# Seleziona le osservazioni per la persona specifica
person_data <- combined_data[combined_data$id == person_id, ]

# Funzione per creare un vettore di pesi esponenziali
create_exponential_weights <- function(n, alpha) {
  weights <- exp(-alpha * seq(0, n-1))
  return(weights)
}

# Calcola il numero di osservazioni
n <- nrow(person_data)

# Calcola i pesi esponenziali
alpha <- 2  # Puoi regolare il valore di alpha
weights_ecdf <- create_exponential_weights(n, alpha)

# Calcola l'EDF per la covariata specifica
edf <- spatstat.geom::ewcdf(person_data[[covariate]], weights = weights_ecdf, normalise = TRUE)

# Visualizza l'EDF
plot(edf, main = "",
     xlab = covariate, ylab = "Empirical Probability")

# main = paste("EDF for", covariate, "for Person", person_id)

#ecdf per una covariata musica

# Esempio di calcolo della profondit? della funzione per una covariata specifica
covariate <- "energy"  # Sostituisci con la covariata desiderata

# Creare una lista di EDF per tutte le persone
edf_list <- lapply(unique(combined_data$id), function(person_id) {
  person_data <- combined_data[combined_data$id == person_id, ]
  spatstat.geom::ewcdf(person_data[[covariate]], weights = NULL, normalise = TRUE) # weights = weights_ecdf for weighted version
})

plot(NULL, xlim = c(0, 1), ylim = c(0, 1),
     main = "Empirical Distribution Functions (EDF)",
     xlab = "Data Values", ylab = "Probability")

# Tracciare ogni EDF dalla lista
for (i in seq_along(edf_list)) {
  lines(edf_list[[i]], lwd = 0.5, cex = 0.1)
}

auxiliarry functions

grid <- seq(0, 1, length.out = 50)
create_edf_list <- function(music_cov){
  edf_list <-  lapply(unique(combined_data$id), function(person_id) {
    ecdf <- spatstat.geom::ewcdf(combined_data[combined_data$id == person_id,music_cov ],weights = NULL, normalise = TRUE)
    val = ecdf(grid)
    return(val)
  })
  return(edf_list)
}

create_indices_list <- function(unique_groups,survey_cov,median_curve_list){
  indices_list <- list()
  for (group in unique_groups) {
    indices <- which(survey_data[,survey_cov] == group)
    indices_list[[as.character(group)]] <- indices
  }
  return(indices_list)
}

plot_ecdf <- function(music_cov,survey_cov,edf_list,color_palette,median_curve_list){
  unique_groups = levels(as.factor(combined_data[,survey_cov]))
  plot(NULL, xlim = c(0, 1), ylim = c(0, 1),
  main = "",
  #main = paste0(c("Empirical Distribution Functions (EDF) ",music_cov,"-",survey_cov)),
  xlab = "Data Values", ylab = "Probability")
  
  lapply(seq_along(edf_list), function(i) {
    group_value <- survey_data[i + 1, survey_cov]
    lines(grid, edf_list[[i]], lwd = 0.5, col = color_palette[unique_groups == group_value], cex = 0.1)
  })
  
  # Utilizza lapply e sapply per evitare il secondo ciclo for
  sapply(seq_along(unique_groups), function(i) {
    lines(grid, median_curve_list[[i]]$values, col = color_palette[i], lwd = 4)
  })
  legend("bottomright", legend = unique_groups, col = color_palette, lwd = 2, cex = 0.8)
}


create_factors <- function(indices_list){
  length_list = length(unlist(indices_list))
  return_vect <- rep(0,length_list)
  for( g in 2:length(names(indices_list))){
    sub_group = indices_list[[g]]
    for(i in 1:length(sub_group))
      return_vect[sub_group[i]] = g-1
  }
  return(return_vect)
}


# Funzione per creare un vettore di pesi esponenziali
create_exponential_weights <- function(n, alpha) {
  weights <- exp(-alpha * seq(0, n-1))
  return(weights)
}

# Calcola il numero di osservazioni
n <- nrow(person_data)

# Calcola i pesi esponenziali
alpha <- 0.99  # Puoi regolare il valore di alpha
weights_ecdf <- create_exponential_weights(n, alpha)

music_vars = colnames(data_numeric_cleaned)[1:12]
#music_vars = music_vars[!(music_vars %in% c("year","duration"))]
survey_covs = colnames(survey_data)[1:14]
survey_covs = survey_covs[!(survey_covs %in% c("genere","id"))]
ecdf_plotter <- function(music_cov, survey_cov){ 
  
  # Creare una lista di EDF per tutte le persone
  edf_list <- create_edf_list(music_cov)

  
  # Definisci una palette di colori in base ai valori unici nella colonna di gruppo
  unique_groups = levels(as.factor(combined_data[,survey_cov]))
  num_groups <- length(unique_groups)
  color_palette <- rainbow(num_groups)
  indices_list <- create_indices_list(unique_groups,survey_cov)  
  median_curve_list = list()
  for (i in 1:num_groups) {
   matrice_da_lista_i <- do.call(cbind, edf_list[indices_list[[i]]])
   f_data = fData(grid, t(matrice_da_lista_i))
   median_curve_list[[i]] <- median_fData(fData = f_data, type = "MBD")
  
  }
  plot_ecdf(music_cov,survey_cov,edf_list,color_palette,median_curve_list)

}


ecdf_plotter("popularity","sesso")

for (s in survey_covs){
  ecdf_plotter("acousticness",s )
}

NA

depth function

depth_covcov <- function(music_cov, survey_cov){ 
  
  # Creare una lista di EDF per tutte le persone
  edf_list <- create_edf_list(music_cov)
  matrice_da_lista_all <- do.call(cbind, edf_list)
  response = t(matrice_da_lista_all)
  f_data_all = fData(grid, response)
  
  # Definisci una palette di colori in base ai valori unici nella colonna di gruppo
  unique_groups = levels(as.factor(combined_data[,survey_cov]))
  print(unique_groups)
  num_groups <- length(unique_groups)
  color_palette <- rainbow(num_groups)
  indices_list <- create_indices_list(unique_groups,survey_cov)  
  
  
  quantile_list <- list()
  relative_BD_list <- list()
  
  for (i in 1:num_groups) {
   matrice_da_lista_i <- do.call(cbind, edf_list[indices_list[[i]]])
   matrice_da_lista_ALTRI <- do.call(cbind, edf_list[-indices_list[[i]]])
   f_data_i = fData(grid, t(matrice_da_lista_i))
   f_data_ALTRI = fData(grid, t(matrice_da_lista_ALTRI))
   # median_curve_list[[i]] <- median_fData(fData = f_data, type = "MBD")
  
   #relative depth function
   relative_BD_result <- MBD_relative(f_data_i, f_data_ALTRI)
   quantile_list[[i]] <- quantile(relative_BD_result, probs = 0.05)
  
   # Memorizza il risultato insieme al nome del gruppo
   #relative_BD_list[[i]] <- list(group_name = unique_groups[i], result = relative_BD_result)
  }
  return (quantile_list)
  #for (i in 1:num_groups)
    #print(paste(paste("Group:", relative_BD_list[[i]]$group_name),relative_BD_list[[i]]$result))
  #plot_ecdf(music_cov,survey_cov,edf_list,color_palette,median_curve_list)

}

https://www.rdocumentation.org/packages/roahd/versions/1.4

depth_covcov("popularity","abitanti.citta")
[1] "Meno di 100.000 abitanti"       "Pi? di 500 000 abitanti"       
[3] "Più di 500 000 abitanti"        "Tra 100.000 e 500.000 abitanti"
[[1]]
       5% 
0.2721139 

[[2]]
       5% 
0.2023342 

[[3]]
       5% 
0.1916436 

[[4]]
        5% 
0.08183937 

covariata persona fissata

for(m in music_vars){
  print(m)
  depth_covcov(m,"libri")
}
[1] "popularity"
[1] "0"  "1+"
[1] "acousticness"
[1] "0"  "1+"
[1] "danceability"
[1] "0"  "1+"
[1] "energy"
[1] "0"  "1+"
[1] "instrumentalness"
[1] "0"  "1+"
[1] "liveness"
[1] "0"  "1+"
[1] "loudness"
[1] "0"  "1+"
[1] "speechiness"
[1] "0"  "1+"
[1] "tempo"
[1] "0"  "1+"
[1] "valence"
[1] "0"  "1+"
[1] "duration"
[1] "0"  "1+"
[1] "year"
[1] "0"  "1+"

all music all survey covs

quantile_list_list_list = list()
i = 1
for(m in music_vars){
  print(paste("------MUSIC COVARIATE:",m))
  quantile_list_list = list()
  j = 1
  for (s in survey_covs){
    print(paste("**SURVEY COVARIATE:",s))
    quantile_list_list[[j]] <- depth_covcov(m,s)
    j = j + 1
  }
  quantile_list_list_list[[i]] <- quantile_list_list
  i = i + 1
}
[1] "------MUSIC COVARIATE: popularity"
[1] "**SURVEY COVARIATE: age"
[1] "Over23"  "Under23"
[1] "**SURVEY COVARIATE: sesso"
[1] "Femmina" "Maschio"
[1] "**SURVEY COVARIATE: campo.studi"
[1] "Others"                                              
[2] "STEM (Science, Technology, Engineering, Mathematics)"
[1] "**SURVEY COVARIATE: stato"
[1] "Italia" "Others"
[1] "**SURVEY COVARIATE: libri"
[1] "0"  "1+"
[1] "**SURVEY COVARIATE: lavoro"
[1] "Full time" "no"        "Part time"
[1] "**SURVEY COVARIATE: importanza.musica"
[1] "abbastanza" "molto"      "poco"       "tanto"     
[1] "**SURVEY COVARIATE: come.ascolti.musica"
[1] "ascolto musica solo in sottofondo quando faccio altro"       
[2] "ascolto musica volentieri ma non mi allontano dai miei gusti"
[3] "ricerco spesso musica nuova e la considero un’attività a sé" 
[1] "**SURVEY COVARIATE: concerti"
[1] "<=1"   "(1,3]" ">3"   
[1] "**SURVEY COVARIATE: strumento"
[1] "No" "Si"
[1] "**SURVEY COVARIATE: estero"
[1] "No" "Si"
[1] "**SURVEY COVARIATE: regione"
[1] "centro-sud" "nord"      
[1] "**SURVEY COVARIATE: abitanti.citta"
[1] "Meno di 100.000 abitanti"       "Pi? di 500 000 abitanti"       
[3] "Più di 500 000 abitanti"        "Tra 100.000 e 500.000 abitanti"
[1] "------MUSIC COVARIATE: acousticness"
[1] "**SURVEY COVARIATE: age"
[1] "Over23"  "Under23"
[1] "**SURVEY COVARIATE: sesso"
[1] "Femmina" "Maschio"
[1] "**SURVEY COVARIATE: campo.studi"
[1] "Others"                                              
[2] "STEM (Science, Technology, Engineering, Mathematics)"
[1] "**SURVEY COVARIATE: stato"
[1] "Italia" "Others"
[1] "**SURVEY COVARIATE: libri"
[1] "0"  "1+"
[1] "**SURVEY COVARIATE: lavoro"
[1] "Full time" "no"        "Part time"
[1] "**SURVEY COVARIATE: importanza.musica"
[1] "abbastanza" "molto"      "poco"       "tanto"     
[1] "**SURVEY COVARIATE: come.ascolti.musica"
[1] "ascolto musica solo in sottofondo quando faccio altro"       
[2] "ascolto musica volentieri ma non mi allontano dai miei gusti"
[3] "ricerco spesso musica nuova e la considero un’attività a sé" 
[1] "**SURVEY COVARIATE: concerti"
[1] "<=1"   "(1,3]" ">3"   
[1] "**SURVEY COVARIATE: strumento"
[1] "No" "Si"
[1] "**SURVEY COVARIATE: estero"
[1] "No" "Si"
[1] "**SURVEY COVARIATE: regione"
[1] "centro-sud" "nord"      
[1] "**SURVEY COVARIATE: abitanti.citta"
[1] "Meno di 100.000 abitanti"       "Pi? di 500 000 abitanti"       
[3] "Più di 500 000 abitanti"        "Tra 100.000 e 500.000 abitanti"
[1] "------MUSIC COVARIATE: danceability"
[1] "**SURVEY COVARIATE: age"
[1] "Over23"  "Under23"
[1] "**SURVEY COVARIATE: sesso"
[1] "Femmina" "Maschio"
[1] "**SURVEY COVARIATE: campo.studi"
[1] "Others"                                              
[2] "STEM (Science, Technology, Engineering, Mathematics)"
[1] "**SURVEY COVARIATE: stato"
[1] "Italia" "Others"
[1] "**SURVEY COVARIATE: libri"
[1] "0"  "1+"
[1] "**SURVEY COVARIATE: lavoro"
[1] "Full time" "no"        "Part time"
[1] "**SURVEY COVARIATE: importanza.musica"
[1] "abbastanza" "molto"      "poco"       "tanto"     
[1] "**SURVEY COVARIATE: come.ascolti.musica"
[1] "ascolto musica solo in sottofondo quando faccio altro"       
[2] "ascolto musica volentieri ma non mi allontano dai miei gusti"
[3] "ricerco spesso musica nuova e la considero un’attività a sé" 
[1] "**SURVEY COVARIATE: concerti"
[1] "<=1"   "(1,3]" ">3"   
[1] "**SURVEY COVARIATE: strumento"
[1] "No" "Si"
[1] "**SURVEY COVARIATE: estero"
[1] "No" "Si"
[1] "**SURVEY COVARIATE: regione"
[1] "centro-sud" "nord"      
[1] "**SURVEY COVARIATE: abitanti.citta"
[1] "Meno di 100.000 abitanti"       "Pi? di 500 000 abitanti"       
[3] "Più di 500 000 abitanti"        "Tra 100.000 e 500.000 abitanti"
[1] "------MUSIC COVARIATE: energy"
[1] "**SURVEY COVARIATE: age"
[1] "Over23"  "Under23"
[1] "**SURVEY COVARIATE: sesso"
[1] "Femmina" "Maschio"
[1] "**SURVEY COVARIATE: campo.studi"
[1] "Others"                                              
[2] "STEM (Science, Technology, Engineering, Mathematics)"
[1] "**SURVEY COVARIATE: stato"
[1] "Italia" "Others"
[1] "**SURVEY COVARIATE: libri"
[1] "0"  "1+"
[1] "**SURVEY COVARIATE: lavoro"
[1] "Full time" "no"        "Part time"
[1] "**SURVEY COVARIATE: importanza.musica"
[1] "abbastanza" "molto"      "poco"       "tanto"     
[1] "**SURVEY COVARIATE: come.ascolti.musica"
[1] "ascolto musica solo in sottofondo quando faccio altro"       
[2] "ascolto musica volentieri ma non mi allontano dai miei gusti"
[3] "ricerco spesso musica nuova e la considero un’attività a sé" 
[1] "**SURVEY COVARIATE: concerti"
[1] "<=1"   "(1,3]" ">3"   
[1] "**SURVEY COVARIATE: strumento"
[1] "No" "Si"
[1] "**SURVEY COVARIATE: estero"
[1] "No" "Si"
[1] "**SURVEY COVARIATE: regione"
[1] "centro-sud" "nord"      
[1] "**SURVEY COVARIATE: abitanti.citta"
[1] "Meno di 100.000 abitanti"       "Pi? di 500 000 abitanti"       
[3] "Più di 500 000 abitanti"        "Tra 100.000 e 500.000 abitanti"
[1] "------MUSIC COVARIATE: instrumentalness"
[1] "**SURVEY COVARIATE: age"
[1] "Over23"  "Under23"
[1] "**SURVEY COVARIATE: sesso"
[1] "Femmina" "Maschio"
[1] "**SURVEY COVARIATE: campo.studi"
[1] "Others"                                              
[2] "STEM (Science, Technology, Engineering, Mathematics)"
[1] "**SURVEY COVARIATE: stato"
[1] "Italia" "Others"
[1] "**SURVEY COVARIATE: libri"
[1] "0"  "1+"
[1] "**SURVEY COVARIATE: lavoro"
[1] "Full time" "no"        "Part time"
[1] "**SURVEY COVARIATE: importanza.musica"
[1] "abbastanza" "molto"      "poco"       "tanto"     
[1] "**SURVEY COVARIATE: come.ascolti.musica"
[1] "ascolto musica solo in sottofondo quando faccio altro"       
[2] "ascolto musica volentieri ma non mi allontano dai miei gusti"
[3] "ricerco spesso musica nuova e la considero un’attività a sé" 
[1] "**SURVEY COVARIATE: concerti"
[1] "<=1"   "(1,3]" ">3"   
[1] "**SURVEY COVARIATE: strumento"
[1] "No" "Si"
[1] "**SURVEY COVARIATE: estero"
[1] "No" "Si"
[1] "**SURVEY COVARIATE: regione"
[1] "centro-sud" "nord"      
[1] "**SURVEY COVARIATE: abitanti.citta"
[1] "Meno di 100.000 abitanti"       "Pi? di 500 000 abitanti"       
[3] "Più di 500 000 abitanti"        "Tra 100.000 e 500.000 abitanti"
[1] "------MUSIC COVARIATE: liveness"
[1] "**SURVEY COVARIATE: age"
[1] "Over23"  "Under23"
[1] "**SURVEY COVARIATE: sesso"
[1] "Femmina" "Maschio"
[1] "**SURVEY COVARIATE: campo.studi"
[1] "Others"                                              
[2] "STEM (Science, Technology, Engineering, Mathematics)"
[1] "**SURVEY COVARIATE: stato"
[1] "Italia" "Others"
[1] "**SURVEY COVARIATE: libri"
[1] "0"  "1+"
[1] "**SURVEY COVARIATE: lavoro"
[1] "Full time" "no"        "Part time"
[1] "**SURVEY COVARIATE: importanza.musica"
[1] "abbastanza" "molto"      "poco"       "tanto"     
[1] "**SURVEY COVARIATE: come.ascolti.musica"
[1] "ascolto musica solo in sottofondo quando faccio altro"       
[2] "ascolto musica volentieri ma non mi allontano dai miei gusti"
[3] "ricerco spesso musica nuova e la considero un’attività a sé" 
[1] "**SURVEY COVARIATE: concerti"
[1] "<=1"   "(1,3]" ">3"   
[1] "**SURVEY COVARIATE: strumento"
[1] "No" "Si"
[1] "**SURVEY COVARIATE: estero"
[1] "No" "Si"
[1] "**SURVEY COVARIATE: regione"
[1] "centro-sud" "nord"      
[1] "**SURVEY COVARIATE: abitanti.citta"
[1] "Meno di 100.000 abitanti"       "Pi? di 500 000 abitanti"       
[3] "Più di 500 000 abitanti"        "Tra 100.000 e 500.000 abitanti"
[1] "------MUSIC COVARIATE: loudness"
[1] "**SURVEY COVARIATE: age"
[1] "Over23"  "Under23"
[1] "**SURVEY COVARIATE: sesso"
[1] "Femmina" "Maschio"
[1] "**SURVEY COVARIATE: campo.studi"
[1] "Others"                                              
[2] "STEM (Science, Technology, Engineering, Mathematics)"
[1] "**SURVEY COVARIATE: stato"
[1] "Italia" "Others"
[1] "**SURVEY COVARIATE: libri"
[1] "0"  "1+"
[1] "**SURVEY COVARIATE: lavoro"
[1] "Full time" "no"        "Part time"
[1] "**SURVEY COVARIATE: importanza.musica"
[1] "abbastanza" "molto"      "poco"       "tanto"     
[1] "**SURVEY COVARIATE: come.ascolti.musica"
[1] "ascolto musica solo in sottofondo quando faccio altro"       
[2] "ascolto musica volentieri ma non mi allontano dai miei gusti"
[3] "ricerco spesso musica nuova e la considero un’attività a sé" 
[1] "**SURVEY COVARIATE: concerti"
[1] "<=1"   "(1,3]" ">3"   
[1] "**SURVEY COVARIATE: strumento"
[1] "No" "Si"
[1] "**SURVEY COVARIATE: estero"
[1] "No" "Si"
[1] "**SURVEY COVARIATE: regione"
[1] "centro-sud" "nord"      
[1] "**SURVEY COVARIATE: abitanti.citta"
[1] "Meno di 100.000 abitanti"       "Pi? di 500 000 abitanti"       
[3] "Più di 500 000 abitanti"        "Tra 100.000 e 500.000 abitanti"
[1] "------MUSIC COVARIATE: speechiness"
[1] "**SURVEY COVARIATE: age"
[1] "Over23"  "Under23"
[1] "**SURVEY COVARIATE: sesso"
[1] "Femmina" "Maschio"
[1] "**SURVEY COVARIATE: campo.studi"
[1] "Others"                                              
[2] "STEM (Science, Technology, Engineering, Mathematics)"
[1] "**SURVEY COVARIATE: stato"
[1] "Italia" "Others"
[1] "**SURVEY COVARIATE: libri"
[1] "0"  "1+"
[1] "**SURVEY COVARIATE: lavoro"
[1] "Full time" "no"        "Part time"
[1] "**SURVEY COVARIATE: importanza.musica"
[1] "abbastanza" "molto"      "poco"       "tanto"     
[1] "**SURVEY COVARIATE: come.ascolti.musica"
[1] "ascolto musica solo in sottofondo quando faccio altro"       
[2] "ascolto musica volentieri ma non mi allontano dai miei gusti"
[3] "ricerco spesso musica nuova e la considero un’attività a sé" 
[1] "**SURVEY COVARIATE: concerti"
[1] "<=1"   "(1,3]" ">3"   
[1] "**SURVEY COVARIATE: strumento"
[1] "No" "Si"
[1] "**SURVEY COVARIATE: estero"
[1] "No" "Si"
[1] "**SURVEY COVARIATE: regione"
[1] "centro-sud" "nord"      
[1] "**SURVEY COVARIATE: abitanti.citta"
[1] "Meno di 100.000 abitanti"       "Pi? di 500 000 abitanti"       
[3] "Più di 500 000 abitanti"        "Tra 100.000 e 500.000 abitanti"
[1] "------MUSIC COVARIATE: tempo"
[1] "**SURVEY COVARIATE: age"
[1] "Over23"  "Under23"
[1] "**SURVEY COVARIATE: sesso"
[1] "Femmina" "Maschio"
[1] "**SURVEY COVARIATE: campo.studi"
[1] "Others"                                              
[2] "STEM (Science, Technology, Engineering, Mathematics)"
[1] "**SURVEY COVARIATE: stato"
[1] "Italia" "Others"
[1] "**SURVEY COVARIATE: libri"
[1] "0"  "1+"
[1] "**SURVEY COVARIATE: lavoro"
[1] "Full time" "no"        "Part time"
[1] "**SURVEY COVARIATE: importanza.musica"
[1] "abbastanza" "molto"      "poco"       "tanto"     
[1] "**SURVEY COVARIATE: come.ascolti.musica"
[1] "ascolto musica solo in sottofondo quando faccio altro"       
[2] "ascolto musica volentieri ma non mi allontano dai miei gusti"
[3] "ricerco spesso musica nuova e la considero un’attività a sé" 
[1] "**SURVEY COVARIATE: concerti"
[1] "<=1"   "(1,3]" ">3"   
[1] "**SURVEY COVARIATE: strumento"
[1] "No" "Si"
[1] "**SURVEY COVARIATE: estero"
[1] "No" "Si"
[1] "**SURVEY COVARIATE: regione"
[1] "centro-sud" "nord"      
[1] "**SURVEY COVARIATE: abitanti.citta"
[1] "Meno di 100.000 abitanti"       "Pi? di 500 000 abitanti"       
[3] "Più di 500 000 abitanti"        "Tra 100.000 e 500.000 abitanti"
[1] "------MUSIC COVARIATE: valence"
[1] "**SURVEY COVARIATE: age"
[1] "Over23"  "Under23"
[1] "**SURVEY COVARIATE: sesso"
[1] "Femmina" "Maschio"
[1] "**SURVEY COVARIATE: campo.studi"
[1] "Others"                                              
[2] "STEM (Science, Technology, Engineering, Mathematics)"
[1] "**SURVEY COVARIATE: stato"
[1] "Italia" "Others"
[1] "**SURVEY COVARIATE: libri"
[1] "0"  "1+"
[1] "**SURVEY COVARIATE: lavoro"
[1] "Full time" "no"        "Part time"
[1] "**SURVEY COVARIATE: importanza.musica"
[1] "abbastanza" "molto"      "poco"       "tanto"     
[1] "**SURVEY COVARIATE: come.ascolti.musica"
[1] "ascolto musica solo in sottofondo quando faccio altro"       
[2] "ascolto musica volentieri ma non mi allontano dai miei gusti"
[3] "ricerco spesso musica nuova e la considero un’attività a sé" 
[1] "**SURVEY COVARIATE: concerti"
[1] "<=1"   "(1,3]" ">3"   
[1] "**SURVEY COVARIATE: strumento"
[1] "No" "Si"
[1] "**SURVEY COVARIATE: estero"
[1] "No" "Si"
[1] "**SURVEY COVARIATE: regione"
[1] "centro-sud" "nord"      
[1] "**SURVEY COVARIATE: abitanti.citta"
[1] "Meno di 100.000 abitanti"       "Pi? di 500 000 abitanti"       
[3] "Più di 500 000 abitanti"        "Tra 100.000 e 500.000 abitanti"
[1] "------MUSIC COVARIATE: duration"
[1] "**SURVEY COVARIATE: age"
[1] "Over23"  "Under23"
[1] "**SURVEY COVARIATE: sesso"
[1] "Femmina" "Maschio"
[1] "**SURVEY COVARIATE: campo.studi"
[1] "Others"                                              
[2] "STEM (Science, Technology, Engineering, Mathematics)"
[1] "**SURVEY COVARIATE: stato"
[1] "Italia" "Others"
[1] "**SURVEY COVARIATE: libri"
[1] "0"  "1+"
[1] "**SURVEY COVARIATE: lavoro"
[1] "Full time" "no"        "Part time"
[1] "**SURVEY COVARIATE: importanza.musica"
[1] "abbastanza" "molto"      "poco"       "tanto"     
[1] "**SURVEY COVARIATE: come.ascolti.musica"
[1] "ascolto musica solo in sottofondo quando faccio altro"       
[2] "ascolto musica volentieri ma non mi allontano dai miei gusti"
[3] "ricerco spesso musica nuova e la considero un’attività a sé" 
[1] "**SURVEY COVARIATE: concerti"
[1] "<=1"   "(1,3]" ">3"   
[1] "**SURVEY COVARIATE: strumento"
[1] "No" "Si"
[1] "**SURVEY COVARIATE: estero"
[1] "No" "Si"
[1] "**SURVEY COVARIATE: regione"
[1] "centro-sud" "nord"      
[1] "**SURVEY COVARIATE: abitanti.citta"
[1] "Meno di 100.000 abitanti"       "Pi? di 500 000 abitanti"       
[3] "Più di 500 000 abitanti"        "Tra 100.000 e 500.000 abitanti"
[1] "------MUSIC COVARIATE: year"
[1] "**SURVEY COVARIATE: age"
[1] "Over23"  "Under23"
[1] "**SURVEY COVARIATE: sesso"
[1] "Femmina" "Maschio"
[1] "**SURVEY COVARIATE: campo.studi"
[1] "Others"                                              
[2] "STEM (Science, Technology, Engineering, Mathematics)"
[1] "**SURVEY COVARIATE: stato"
[1] "Italia" "Others"
[1] "**SURVEY COVARIATE: libri"
[1] "0"  "1+"
[1] "**SURVEY COVARIATE: lavoro"
[1] "Full time" "no"        "Part time"
[1] "**SURVEY COVARIATE: importanza.musica"
[1] "abbastanza" "molto"      "poco"       "tanto"     
[1] "**SURVEY COVARIATE: come.ascolti.musica"
[1] "ascolto musica solo in sottofondo quando faccio altro"       
[2] "ascolto musica volentieri ma non mi allontano dai miei gusti"
[3] "ricerco spesso musica nuova e la considero un’attività a sé" 
[1] "**SURVEY COVARIATE: concerti"
[1] "<=1"   "(1,3]" ">3"   
[1] "**SURVEY COVARIATE: strumento"
[1] "No" "Si"
[1] "**SURVEY COVARIATE: estero"
[1] "No" "Si"
[1] "**SURVEY COVARIATE: regione"
[1] "centro-sud" "nord"      
[1] "**SURVEY COVARIATE: abitanti.citta"
[1] "Meno di 100.000 abitanti"       "Pi? di 500 000 abitanti"       
[3] "Più di 500 000 abitanti"        "Tra 100.000 e 500.000 abitanti"
list = list()
value = list()
u = 1
a= 1
for (l in quantile_list_list_list){
  b = 1
  for (g in l){
    c = 1
      for (v in g) {
        if (v <0.08) {
          list[[u]] <- c(a,b,c)
          value[[u]] <- v
          u = u + 1
        }
        c = c + 1
      }
    b = b + 1
  }  
  a = a + 1
}
          
# qui
ecdf_plotter("acousticness","come.ascolti.musica")

ecdf_plotter("acousticness","strumento")

ecdf_plotter("instrumentalness","libri")

ecdf_plotter("instrumentalness","lavoro")



# just an example
ecdf_plotter("popularity", "sesso")

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQpgYGB7cn0KbGlicmFyeShoZXhiaW4pCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShyb2FoZCkKbGlicmFyeSgiZmRhdGVzdCIpCmxpYnJhcnkoc3BhdHN0YXQuZ2VvbSkKYGBgCgojIGxvYWQgYW5kIHByZXByb2Nlc3MgdGhlIGRhdGEKCmBgYHtyfQpkYXRhX251bWVyaWNfY2xlYW5lZCA9IHJlYWRSRFMoImRhdGFfZmluYWwvZGF0YV9udW1lcmljX2NsZWFuZWQuUkRhdGEiKQpzdXJ2ZXlfZGF0YSA9IHJlYWRSRFMoImRhdGFfZmluYWwvc3VydmV5X3JlZHVjZWQuUkRhdGEiKQoKYGBgCgoKCiMgY29tYmluZSB0aGUgZGF0YQoKYGBge3J9CmNvbWJpbmVkX2RhdGEgPC0gbWVyZ2UoZGF0YV9udW1lcmljX2NsZWFuZWQsIHN1cnZleV9kYXRhLCBieS54ID0gImlkIiwgYnkueSA9ICJpZCIpCmBgYAoKIyBzaW5nbGUgZWNkZgoKYGBge3J9CnBlcnNvbl9pZCA8LSAiMDNOcGx3NEdPMmg1dXQ1IiAgIyBTb3N0aXR1aXNjaSBjb24gbCdJRCBkZWxsYSBwZXJzb25hIGRlc2lkZXJhdGEKY292YXJpYXRlIDwtICJkYW5jZWFiaWxpdHkiICAjIFNvc3RpdHVpc2NpIGNvbiBsYSBjb3ZhcmlhdGEgZGVzaWRlcmF0YQoKIyBTZWxlemlvbmEgbGUgb3NzZXJ2YXppb25pIHBlciBsYSBwZXJzb25hIHNwZWNpZmljYQpwZXJzb25fZGF0YSA8LSBjb21iaW5lZF9kYXRhW2NvbWJpbmVkX2RhdGEkaWQgPT0gcGVyc29uX2lkLCBdCgojIEZ1bnppb25lIHBlciBjcmVhcmUgdW4gdmV0dG9yZSBkaSBwZXNpIGVzcG9uZW56aWFsaQpjcmVhdGVfZXhwb25lbnRpYWxfd2VpZ2h0cyA8LSBmdW5jdGlvbihuLCBhbHBoYSkgewogIHdlaWdodHMgPC0gZXhwKC1hbHBoYSAqIHNlcSgwLCBuLTEpKQogIHJldHVybih3ZWlnaHRzKQp9CgojIENhbGNvbGEgaWwgbnVtZXJvIGRpIG9zc2VydmF6aW9uaQpuIDwtIG5yb3cocGVyc29uX2RhdGEpCgojIENhbGNvbGEgaSBwZXNpIGVzcG9uZW56aWFsaQphbHBoYSA8LSAyICAjIFB1b2kgcmVnb2xhcmUgaWwgdmFsb3JlIGRpIGFscGhhCndlaWdodHNfZWNkZiA8LSBjcmVhdGVfZXhwb25lbnRpYWxfd2VpZ2h0cyhuLCBhbHBoYSkKCiMgQ2FsY29sYSBsJ0VERiBwZXIgbGEgY292YXJpYXRhIHNwZWNpZmljYQplZGYgPC0gc3BhdHN0YXQuZ2VvbTo6ZXdjZGYocGVyc29uX2RhdGFbW2NvdmFyaWF0ZV1dLCB3ZWlnaHRzID0gd2VpZ2h0c19lY2RmLCBub3JtYWxpc2UgPSBUUlVFKQoKIyBWaXN1YWxpenphIGwnRURGCnBsb3QoZWRmLCBtYWluID0gIiIsCiAgICAgeGxhYiA9IGNvdmFyaWF0ZSwgeWxhYiA9ICJFbXBpcmljYWwgUHJvYmFiaWxpdHkiKQojIG1haW4gPSBwYXN0ZSgiRURGIGZvciIsIGNvdmFyaWF0ZSwgImZvciBQZXJzb24iLCBwZXJzb25faWQpCmBgYAoKI2VjZGYgcGVyIHVuYSBjb3ZhcmlhdGEgbXVzaWNhCgpgYGB7cn0KIyBFc2VtcGlvIGRpIGNhbGNvbG8gZGVsbGEgcHJvZm9uZGl0PyBkZWxsYSBmdW56aW9uZSBwZXIgdW5hIGNvdmFyaWF0YSBzcGVjaWZpY2EKY292YXJpYXRlIDwtICJlbmVyZ3kiICAjIFNvc3RpdHVpc2NpIGNvbiBsYSBjb3ZhcmlhdGEgZGVzaWRlcmF0YQoKIyBDcmVhcmUgdW5hIGxpc3RhIGRpIEVERiBwZXIgdHV0dGUgbGUgcGVyc29uZQplZGZfbGlzdCA8LSBsYXBwbHkodW5pcXVlKGNvbWJpbmVkX2RhdGEkaWQpLCBmdW5jdGlvbihwZXJzb25faWQpIHsKICBwZXJzb25fZGF0YSA8LSBjb21iaW5lZF9kYXRhW2NvbWJpbmVkX2RhdGEkaWQgPT0gcGVyc29uX2lkLCBdCiAgc3BhdHN0YXQuZ2VvbTo6ZXdjZGYocGVyc29uX2RhdGFbW2NvdmFyaWF0ZV1dLCB3ZWlnaHRzID0gTlVMTCwgbm9ybWFsaXNlID0gVFJVRSkgIyB3ZWlnaHRzID0gd2VpZ2h0c19lY2RmIGZvciB3ZWlnaHRlZCB2ZXJzaW9uCn0pCgpwbG90KE5VTEwsIHhsaW0gPSBjKDAsIDEpLCB5bGltID0gYygwLCAxKSwKICAgICBtYWluID0gIkVtcGlyaWNhbCBEaXN0cmlidXRpb24gRnVuY3Rpb25zIChFREYpIiwKICAgICB4bGFiID0gIkRhdGEgVmFsdWVzIiwgeWxhYiA9ICJQcm9iYWJpbGl0eSIpCgojIFRyYWNjaWFyZSBvZ25pIEVERiBkYWxsYSBsaXN0YQpmb3IgKGkgaW4gc2VxX2Fsb25nKGVkZl9saXN0KSkgewogIGxpbmVzKGVkZl9saXN0W1tpXV0sIGx3ZCA9IDAuNSwgY2V4ID0gMC4xKQp9CmBgYAoKIyBhdXhpbGlhcnJ5IGZ1bmN0aW9ucwoKYGBge3J9CmdyaWQgPC0gc2VxKDAsIDEsIGxlbmd0aC5vdXQgPSA1MCkKY3JlYXRlX2VkZl9saXN0IDwtIGZ1bmN0aW9uKG11c2ljX2Nvdil7CiAgZWRmX2xpc3QgPC0gIGxhcHBseSh1bmlxdWUoY29tYmluZWRfZGF0YSRpZCksIGZ1bmN0aW9uKHBlcnNvbl9pZCkgewogICAgZWNkZiA8LSBzcGF0c3RhdC5nZW9tOjpld2NkZihjb21iaW5lZF9kYXRhW2NvbWJpbmVkX2RhdGEkaWQgPT0gcGVyc29uX2lkLG11c2ljX2NvdiBdLHdlaWdodHMgPSBOVUxMLCBub3JtYWxpc2UgPSBUUlVFKQogICAgdmFsID0gZWNkZihncmlkKQogICAgcmV0dXJuKHZhbCkKICB9KQogIHJldHVybihlZGZfbGlzdCkKfQoKY3JlYXRlX2luZGljZXNfbGlzdCA8LSBmdW5jdGlvbih1bmlxdWVfZ3JvdXBzLHN1cnZleV9jb3YsbWVkaWFuX2N1cnZlX2xpc3QpewogIGluZGljZXNfbGlzdCA8LSBsaXN0KCkKICBmb3IgKGdyb3VwIGluIHVuaXF1ZV9ncm91cHMpIHsKICAgIGluZGljZXMgPC0gd2hpY2goc3VydmV5X2RhdGFbLHN1cnZleV9jb3ZdID09IGdyb3VwKQogICAgaW5kaWNlc19saXN0W1thcy5jaGFyYWN0ZXIoZ3JvdXApXV0gPC0gaW5kaWNlcwogIH0KICByZXR1cm4oaW5kaWNlc19saXN0KQp9CgpwbG90X2VjZGYgPC0gZnVuY3Rpb24obXVzaWNfY292LHN1cnZleV9jb3YsZWRmX2xpc3QsY29sb3JfcGFsZXR0ZSxtZWRpYW5fY3VydmVfbGlzdCl7CiAgdW5pcXVlX2dyb3VwcyA9IGxldmVscyhhcy5mYWN0b3IoY29tYmluZWRfZGF0YVssc3VydmV5X2Nvdl0pKQogIHBsb3QoTlVMTCwgeGxpbSA9IGMoMCwgMSksIHlsaW0gPSBjKDAsIDEpLAogIG1haW4gPSAiIiwKICAjbWFpbiA9IHBhc3RlMChjKCJFbXBpcmljYWwgRGlzdHJpYnV0aW9uIEZ1bmN0aW9ucyAoRURGKSAiLG11c2ljX2NvdiwiLSIsc3VydmV5X2NvdikpLAogIHhsYWIgPSAiRGF0YSBWYWx1ZXMiLCB5bGFiID0gIlByb2JhYmlsaXR5IikKICAKICBsYXBwbHkoc2VxX2Fsb25nKGVkZl9saXN0KSwgZnVuY3Rpb24oaSkgewogICAgZ3JvdXBfdmFsdWUgPC0gc3VydmV5X2RhdGFbaSArIDEsIHN1cnZleV9jb3ZdCiAgICBsaW5lcyhncmlkLCBlZGZfbGlzdFtbaV1dLCBsd2QgPSAwLjUsIGNvbCA9IGNvbG9yX3BhbGV0dGVbdW5pcXVlX2dyb3VwcyA9PSBncm91cF92YWx1ZV0sIGNleCA9IDAuMSkKICB9KQogIAogICMgVXRpbGl6emEgbGFwcGx5IGUgc2FwcGx5IHBlciBldml0YXJlIGlsIHNlY29uZG8gY2ljbG8gZm9yCiAgc2FwcGx5KHNlcV9hbG9uZyh1bmlxdWVfZ3JvdXBzKSwgZnVuY3Rpb24oaSkgewogICAgbGluZXMoZ3JpZCwgbWVkaWFuX2N1cnZlX2xpc3RbW2ldXSR2YWx1ZXMsIGNvbCA9IGNvbG9yX3BhbGV0dGVbaV0sIGx3ZCA9IDQpCiAgfSkKICBsZWdlbmQoImJvdHRvbXJpZ2h0IiwgbGVnZW5kID0gdW5pcXVlX2dyb3VwcywgY29sID0gY29sb3JfcGFsZXR0ZSwgbHdkID0gMiwgY2V4ID0gMC44KQp9CgoKY3JlYXRlX2ZhY3RvcnMgPC0gZnVuY3Rpb24oaW5kaWNlc19saXN0KXsKICBsZW5ndGhfbGlzdCA9IGxlbmd0aCh1bmxpc3QoaW5kaWNlc19saXN0KSkKICByZXR1cm5fdmVjdCA8LSByZXAoMCxsZW5ndGhfbGlzdCkKICBmb3IoIGcgaW4gMjpsZW5ndGgobmFtZXMoaW5kaWNlc19saXN0KSkpewogICAgc3ViX2dyb3VwID0gaW5kaWNlc19saXN0W1tnXV0KICAgIGZvcihpIGluIDE6bGVuZ3RoKHN1Yl9ncm91cCkpCiAgICAgIHJldHVybl92ZWN0W3N1Yl9ncm91cFtpXV0gPSBnLTEKICB9CiAgcmV0dXJuKHJldHVybl92ZWN0KQp9CgoKIyBGdW56aW9uZSBwZXIgY3JlYXJlIHVuIHZldHRvcmUgZGkgcGVzaSBlc3BvbmVuemlhbGkKY3JlYXRlX2V4cG9uZW50aWFsX3dlaWdodHMgPC0gZnVuY3Rpb24obiwgYWxwaGEpIHsKICB3ZWlnaHRzIDwtIGV4cCgtYWxwaGEgKiBzZXEoMCwgbi0xKSkKICByZXR1cm4od2VpZ2h0cykKfQoKIyBDYWxjb2xhIGlsIG51bWVybyBkaSBvc3NlcnZhemlvbmkKbiA8LSBucm93KHBlcnNvbl9kYXRhKQoKIyBDYWxjb2xhIGkgcGVzaSBlc3BvbmVuemlhbGkKYWxwaGEgPC0gMC45OSAgIyBQdW9pIHJlZ29sYXJlIGlsIHZhbG9yZSBkaSBhbHBoYQp3ZWlnaHRzX2VjZGYgPC0gY3JlYXRlX2V4cG9uZW50aWFsX3dlaWdodHMobiwgYWxwaGEpCgptdXNpY192YXJzID0gY29sbmFtZXMoZGF0YV9udW1lcmljX2NsZWFuZWQpWzE6MTJdCiNtdXNpY192YXJzID0gbXVzaWNfdmFyc1shKG11c2ljX3ZhcnMgJWluJSBjKCJ5ZWFyIiwiZHVyYXRpb24iKSldCnN1cnZleV9jb3ZzID0gY29sbmFtZXMoc3VydmV5X2RhdGEpWzE6MTRdCnN1cnZleV9jb3ZzID0gc3VydmV5X2NvdnNbIShzdXJ2ZXlfY292cyAlaW4lIGMoImdlbmVyZSIsImlkIikpXQoKCmBgYAoKCmBgYHtyfQplY2RmX3Bsb3R0ZXIgPC0gZnVuY3Rpb24obXVzaWNfY292LCBzdXJ2ZXlfY292KXsgCiAgCiAgIyBDcmVhcmUgdW5hIGxpc3RhIGRpIEVERiBwZXIgdHV0dGUgbGUgcGVyc29uZQogIGVkZl9saXN0IDwtIGNyZWF0ZV9lZGZfbGlzdChtdXNpY19jb3YpCgogIAogICMgRGVmaW5pc2NpIHVuYSBwYWxldHRlIGRpIGNvbG9yaSBpbiBiYXNlIGFpIHZhbG9yaSB1bmljaSBuZWxsYSBjb2xvbm5hIGRpIGdydXBwbwogIHVuaXF1ZV9ncm91cHMgPSBsZXZlbHMoYXMuZmFjdG9yKGNvbWJpbmVkX2RhdGFbLHN1cnZleV9jb3ZdKSkKICBudW1fZ3JvdXBzIDwtIGxlbmd0aCh1bmlxdWVfZ3JvdXBzKQogIGNvbG9yX3BhbGV0dGUgPC0gcmFpbmJvdyhudW1fZ3JvdXBzKQogIGluZGljZXNfbGlzdCA8LSBjcmVhdGVfaW5kaWNlc19saXN0KHVuaXF1ZV9ncm91cHMsc3VydmV5X2NvdikgIAogIG1lZGlhbl9jdXJ2ZV9saXN0ID0gbGlzdCgpCiAgZm9yIChpIGluIDE6bnVtX2dyb3VwcykgewogICBtYXRyaWNlX2RhX2xpc3RhX2kgPC0gZG8uY2FsbChjYmluZCwgZWRmX2xpc3RbaW5kaWNlc19saXN0W1tpXV1dKQogICBmX2RhdGEgPSBmRGF0YShncmlkLCB0KG1hdHJpY2VfZGFfbGlzdGFfaSkpCiAgIG1lZGlhbl9jdXJ2ZV9saXN0W1tpXV0gPC0gbWVkaWFuX2ZEYXRhKGZEYXRhID0gZl9kYXRhLCB0eXBlID0gIk1CRCIpCiAgCiAgfQogIHBsb3RfZWNkZihtdXNpY19jb3Ysc3VydmV5X2NvdixlZGZfbGlzdCxjb2xvcl9wYWxldHRlLG1lZGlhbl9jdXJ2ZV9saXN0KQoKfQoKCmVjZGZfcGxvdHRlcigicG9wdWxhcml0eSIsInNlc3NvIikKZm9yIChzIGluIHN1cnZleV9jb3ZzKXsKICBlY2RmX3Bsb3R0ZXIoImFjb3VzdGljbmVzcyIscyApCn0KCmBgYAoKIyBkZXB0aCBmdW5jdGlvbgpgYGB7cn0KZGVwdGhfY292Y292IDwtIGZ1bmN0aW9uKG11c2ljX2Nvdiwgc3VydmV5X2Nvdil7IAogIAogICMgQ3JlYXJlIHVuYSBsaXN0YSBkaSBFREYgcGVyIHR1dHRlIGxlIHBlcnNvbmUKICBlZGZfbGlzdCA8LSBjcmVhdGVfZWRmX2xpc3QobXVzaWNfY292KQogIG1hdHJpY2VfZGFfbGlzdGFfYWxsIDwtIGRvLmNhbGwoY2JpbmQsIGVkZl9saXN0KQogIHJlc3BvbnNlID0gdChtYXRyaWNlX2RhX2xpc3RhX2FsbCkKICBmX2RhdGFfYWxsID0gZkRhdGEoZ3JpZCwgcmVzcG9uc2UpCiAgCiAgIyBEZWZpbmlzY2kgdW5hIHBhbGV0dGUgZGkgY29sb3JpIGluIGJhc2UgYWkgdmFsb3JpIHVuaWNpIG5lbGxhIGNvbG9ubmEgZGkgZ3J1cHBvCiAgdW5pcXVlX2dyb3VwcyA9IGxldmVscyhhcy5mYWN0b3IoY29tYmluZWRfZGF0YVssc3VydmV5X2Nvdl0pKQogIHByaW50KHVuaXF1ZV9ncm91cHMpCiAgbnVtX2dyb3VwcyA8LSBsZW5ndGgodW5pcXVlX2dyb3VwcykKICBjb2xvcl9wYWxldHRlIDwtIHJhaW5ib3cobnVtX2dyb3VwcykKICBpbmRpY2VzX2xpc3QgPC0gY3JlYXRlX2luZGljZXNfbGlzdCh1bmlxdWVfZ3JvdXBzLHN1cnZleV9jb3YpICAKICAKICAKICBxdWFudGlsZV9saXN0IDwtIGxpc3QoKQogIHJlbGF0aXZlX0JEX2xpc3QgPC0gbGlzdCgpCiAgCiAgZm9yIChpIGluIDE6bnVtX2dyb3VwcykgewogICBtYXRyaWNlX2RhX2xpc3RhX2kgPC0gZG8uY2FsbChjYmluZCwgZWRmX2xpc3RbaW5kaWNlc19saXN0W1tpXV1dKQogICBtYXRyaWNlX2RhX2xpc3RhX0FMVFJJIDwtIGRvLmNhbGwoY2JpbmQsIGVkZl9saXN0Wy1pbmRpY2VzX2xpc3RbW2ldXV0pCiAgIGZfZGF0YV9pID0gZkRhdGEoZ3JpZCwgdChtYXRyaWNlX2RhX2xpc3RhX2kpKQogICBmX2RhdGFfQUxUUkkgPSBmRGF0YShncmlkLCB0KG1hdHJpY2VfZGFfbGlzdGFfQUxUUkkpKQogICAjIG1lZGlhbl9jdXJ2ZV9saXN0W1tpXV0gPC0gbWVkaWFuX2ZEYXRhKGZEYXRhID0gZl9kYXRhLCB0eXBlID0gIk1CRCIpCiAgCiAgICNyZWxhdGl2ZSBkZXB0aCBmdW5jdGlvbgogICByZWxhdGl2ZV9CRF9yZXN1bHQgPC0gTUJEX3JlbGF0aXZlKGZfZGF0YV9pLCBmX2RhdGFfQUxUUkkpCiAgIHF1YW50aWxlX2xpc3RbW2ldXSA8LSBxdWFudGlsZShyZWxhdGl2ZV9CRF9yZXN1bHQsIHByb2JzID0gMC4wNSkKICAKICAgIyBNZW1vcml6emEgaWwgcmlzdWx0YXRvIGluc2llbWUgYWwgbm9tZSBkZWwgZ3J1cHBvCiAgICNyZWxhdGl2ZV9CRF9saXN0W1tpXV0gPC0gbGlzdChncm91cF9uYW1lID0gdW5pcXVlX2dyb3Vwc1tpXSwgcmVzdWx0ID0gcmVsYXRpdmVfQkRfcmVzdWx0KQogIH0KICByZXR1cm4gKHF1YW50aWxlX2xpc3QpCiAgI2ZvciAoaSBpbiAxOm51bV9ncm91cHMpCiAgICAjcHJpbnQocGFzdGUocGFzdGUoIkdyb3VwOiIsIHJlbGF0aXZlX0JEX2xpc3RbW2ldXSRncm91cF9uYW1lKSxyZWxhdGl2ZV9CRF9saXN0W1tpXV0kcmVzdWx0KSkKICAjcGxvdF9lY2RmKG11c2ljX2NvdixzdXJ2ZXlfY292LGVkZl9saXN0LGNvbG9yX3BhbGV0dGUsbWVkaWFuX2N1cnZlX2xpc3QpCgp9CmBgYApodHRwczovL3d3dy5yZG9jdW1lbnRhdGlvbi5vcmcvcGFja2FnZXMvcm9haGQvdmVyc2lvbnMvMS40CmBgYHtyfQpkZXB0aF9jb3Zjb3YoInBvcHVsYXJpdHkiLCJhYml0YW50aS5jaXR0YSIpCmBgYAoKIyBjb3ZhcmlhdGEgcGVyc29uYSBmaXNzYXRhCmBgYHtyLHdhcm5pbmc9RkFMU0V9CmZvcihtIGluIG11c2ljX3ZhcnMpewogIHByaW50KG0pCiAgZGVwdGhfY292Y292KG0sImxpYnJpIikKfQpgYGAKCiMgYWxsIG11c2ljIGFsbCBzdXJ2ZXkgY292cwpgYGB7cix3YXJuaW5nPUZBTFNFfQpxdWFudGlsZV9saXN0X2xpc3RfbGlzdCA9IGxpc3QoKQppID0gMQpmb3IobSBpbiBtdXNpY192YXJzKXsKICBwcmludChwYXN0ZSgiLS0tLS0tTVVTSUMgQ09WQVJJQVRFOiIsbSkpCiAgcXVhbnRpbGVfbGlzdF9saXN0ID0gbGlzdCgpCiAgaiA9IDEKICBmb3IgKHMgaW4gc3VydmV5X2NvdnMpewogICAgcHJpbnQocGFzdGUoIioqU1VSVkVZIENPVkFSSUFURToiLHMpKQogICAgcXVhbnRpbGVfbGlzdF9saXN0W1tqXV0gPC0gZGVwdGhfY292Y292KG0scykKICAgIGogPSBqICsgMQogIH0KICBxdWFudGlsZV9saXN0X2xpc3RfbGlzdFtbaV1dIDwtIHF1YW50aWxlX2xpc3RfbGlzdAogIGkgPSBpICsgMQp9CgpgYGAKCmBgYHtyfQpsaXN0ID0gbGlzdCgpCnZhbHVlID0gbGlzdCgpCnUgPSAxCmE9IDEKZm9yIChsIGluIHF1YW50aWxlX2xpc3RfbGlzdF9saXN0KXsKICBiID0gMQogIGZvciAoZyBpbiBsKXsKICAgIGMgPSAxCiAgICAgIGZvciAodiBpbiBnKSB7CiAgICAgICAgaWYgKHYgPDAuMDgpIHsKICAgICAgICAgIGxpc3RbW3VdXSA8LSBjKGEsYixjKQogICAgICAgICAgdmFsdWVbW3VdXSA8LSB2CiAgICAgICAgICB1ID0gdSArIDEKICAgICAgICB9CiAgICAgICAgYyA9IGMgKyAxCiAgICAgIH0KICAgIGIgPSBiICsgMQogIH0gIAogIGEgPSBhICsgMQp9CiAgICAgICAgICAKYGBgCgoKYGBge3J9CiMgcXVpCmVjZGZfcGxvdHRlcigiYWNvdXN0aWNuZXNzIiwiY29tZS5hc2NvbHRpLm11c2ljYSIpCmVjZGZfcGxvdHRlcigiYWNvdXN0aWNuZXNzIiwic3RydW1lbnRvIikKZWNkZl9wbG90dGVyKCJpbnN0cnVtZW50YWxuZXNzIiwibGlicmkiKQplY2RmX3Bsb3R0ZXIoImluc3RydW1lbnRhbG5lc3MiLCJsYXZvcm8iKQoKCiMganVzdCBhbiBleGFtcGxlCmVjZGZfcGxvdHRlcigicG9wdWxhcml0eSIsICJzZXNzbyIpCmBgYAoKCg==